package br.senai.sc.model;

import java.io.Serializable;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Type;

@Entity
public class Foto implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_foto")
    private Integer idFoto;

    @OneToOne
    @JoinColumn(name = "id_anexo")
    @Cascade(value = CascadeType.ALL)
    private Anexo anexo;

    private boolean capa;

    private int altura;

    private int largura;

    /**
     * Representa o arquivo a ser salvo.
     * Descobri o BinaryType do hibernate em http://www.guj.com.br/java/230311-erro-ao-persistir-byte
     */
    @Type(type = "org.hibernate.type.BinaryType")
    @Basic(fetch = FetchType.LAZY)
    @Column(name = "thumb")
    private byte[] thumb;

    public Foto() {}

    public Integer getIdFoto() {
        return idFoto;
    }

    public void setIdFoto(Integer idFoto) {
        this.idFoto = idFoto;
    }

    public Anexo getAnexo() {
        return anexo;
    }

    public void setAnexo(Anexo anexo) {
        this.anexo = anexo;
    }

    public boolean isCapa() {
        return capa;
    }

    public void setCapa(boolean capa) {
        this.capa = capa;
    }

    public int getAltura() {
        return altura;
    }

    public void setAltura(int altura) {
        this.altura = altura;
    }

    public int getLargura() {
        return largura;
    }

    public void setLargura(int largura) {
        this.largura = largura;
    }

    public byte[] getThumb() {
        return thumb;
    }

    public void setThumb(byte[] thumb) {
        this.thumb = thumb;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = (prime * result) + altura;
        result = (prime * result) + ((anexo == null) ? 0 : anexo.hashCode());
        result = (prime * result) + largura;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        Foto other = (Foto) obj;
        if (altura != other.altura) {
            return false;
        }
        if (anexo == null) {
            if (other.anexo != null) {
                return false;
            }
        } else if (!anexo.equals(other.anexo)) {
            return false;
        }
        if (largura != other.largura) {
            return false;
        }
        return true;
    }

}